<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    // 有一家猎人工会，每个人都有发布任务(publish)和订阅(subscribe)任务的功能。
    // 他们都有一个订阅列表来记录谁订阅了自己。

    // 创建一个猎人类
    function Hunter(name, level) {
      this.name = name; //姓名
      this.level = level; //级别
      this.list = []; //订阅列表
    }

    // 发布任务 【每个对象都有该方法因此定义在原型链上(解决方法过载问题)】
    Hunter.prototype.publish = function (money) {
      console.log(this.level + "猎人" + this.name + "寻求帮助");
      this.list.forEach(function (item, index) {
        // 对订阅列表函数进行调用
        item(money);
      });
    };

    // 订阅任务
    Hunter.prototype.subscribe = function (target, fn) {
      target.list.push(fn); //传入订阅列表的是一个函数
      console.log(this.level + "猎人" + this.name + "订阅了" + target.name);
    };

    // 创建猎人
    var hunterZhang = new Hunter("老张", "黄金级别");
    var hunterLi = new Hunter("老李", "白银级别");
    var hunterWang = new Hunter("老王", "青铜级别");
    var hunterHou = new Hunter("老侯", "王者级别");

    // 老张订阅猎人老王
    hunterZhang.subscribe(hunterWang, function (money) {
      console.log(
        "老张表示:" + (money > 500 ? "可以的" : "佣金太少，不接收这个任务")
      );
    });
    // 老李订阅猎人老王
    hunterLi.subscribe(hunterWang, function (money) {
      console.log("老李表示:没问题我愿意接受这个任务！");
    });
    // 老侯订阅猎人老王
    hunterHou.subscribe(hunterWang, function (money) {
      console.log("老侯表示:不差钱闲着也是闲着");
    });

    // 老王因为级别低 现发布一个任务,来寻求帮助
    hunterWang.publish(200);

    console.log(hunterWang);
  </script>
</html>
